Extraindo e Visualizando Dados com Web Scraping e Plotly
Introdução
Este projeto tem como objetivo demonstrar a extração e visualização de dados financeiros de empresas públicas, utilizando técnicas de Web Scraping e a biblioteca Plotly. As empresas escolhidas para análise foram Tesla e GameStop, e os dados foram coletados do Yahoo! Finance e Macrotrends.
Descrição do Projeto¶
Este projeto demonstra a extração e visualização de dados financeiros das empresas Tesla e GameStop, utilizando técnicas de Web Scraping e a biblioteca Plotly. O objetivo principal é analisar o histórico de preços das ações e a receita dessas empresas ao longo do tempo, buscando identificar tendências e insights relevantes.
Processo de Web Scraping:
Para coletar os dados, foram utilizadas as seguintes ferramentas e bibliotecas:
- yfinance: Para extrair o histórico de preços das ações da Tesla e GameStop diretamente do Yahoo! Finance.
- requests: Para fazer requisições HTTP e obter o conteúdo HTML das páginas web.
- Beautiful Soup: Para realizar o parsing do HTML e extrair as informações desejadas, como a receita das empresas.
- pandas: Para manipular e organizar os dados em formato de DataFrames.
Visualização de Dados:
Após a extração e limpeza dos dados, foram gerados gráficos interativos utilizando a biblioteca Plotly. Esses gráficos permitem visualizar:
- Preço Histórico das Ações: Mostra a variação do preço das ações da Tesla e GameStop ao longo do tempo.
- Valor Histórico de Receita: Apresenta a evolução da receita das empresas ao longo dos anos.
A combinação do Web Scraping com a visualização de dados proporciona uma análise abrangente do desempenho financeiro das empresas, facilitando a identificação de padrões e insights importantes.
Observação: Este projeto foi desenvolvido como parte do curso "Python Project for Data Science" da IBM.
Índice
- Definindo uma função que cria o gráfico
- Passo 1: Usando yfinance para extrair dados de ações da Tesla
- Passo 2: Usando Web scraping para extrair dados de receita da Tesla
- Passo 3: Usando yfinance para extrair dados de ações da GameStop
- Passo 4: Usando Web scraping para extrair dados de receita da GameStop
- Passo 5: Plotando o gráfico da Tesla
- Passo 6: Plotando o gráfico da GameStop
#Caso queira rodar esse notebook localmente
#!pip install yfinance
#!pip install bs4
#!pip install nbformat
# Importa a biblioteca yfinance para acessar dados financeiros de ações
import yfinance as yf
# Importa a biblioteca pandas para manipulação de dados em formato de DataFrame
import pandas as pd
# Importa a biblioteca requests para fazer requisições HTTP
import requests
# Importa a biblioteca BeautifulSoup da bs4 para fazer web scraping de HTML
from bs4 import BeautifulSoup
# Importa o Plotly para visualização de gráficos interativos
import plotly.graph_objects as go
# Importa a função make_subplots do Plotly para criar gráficos com múltiplos subgráficos
from plotly.subplots import make_subplots
Em Python, é possível ignorar avisos utilizando o módulo warnings. Usei a função filterwarnings para filtrar ou ignorar mensagens de aviso específicas que não são relevantes para os resultados da análise.
# Importa o módulo de warnings para filtrar ou ignorar mensagens de aviso
import warnings
# Ignora todos os avisos do tipo FutureWarning
warnings.filterwarnings("ignore", category=FutureWarning)
Definindo uma função que cria o gráfico
# Função para criar um gráfico comparando preço das ações e receita das empresas
def make_graph(stock_data, revenue_data, stock):
# Cria um gráfico com 2 subgráficos, um para o preço das ações e outro para a receita
fig = make_subplots(rows=2, cols=1, shared_xaxes=True, subplot_titles=("Preço Histórico das Ações", "Valor Histórico de Receita"), vertical_spacing = .3)
# Obtém a data mais recente dos dados
latest_date_stock = stock_data["Date"].max()
latest_date_revenue = revenue_data["Date"].max()
# Filtra os dados até a data mais recente
stock_data_specific = stock_data[stock_data.Date <= latest_date_stock]
revenue_data_specific = revenue_data[revenue_data.Date <= latest_date_revenue]
# Adiciona o gráfico do preço das ações no primeiro subgráfico
fig.add_trace(go.Scatter(x=pd.to_datetime(stock_data_specific.Date),
y=stock_data_specific.Close.astype("float"), name="Share Price"), row=1, col=1)
# Adiciona o gráfico da receita no segundo subgráfico
fig.add_trace(go.Scatter(x=pd.to_datetime(revenue_data_specific.Date),
y=revenue_data_specific.Revenue.astype("float"), name="Revenue"), row=2, col=1)
# Configura o título dos eixos X para ambos os gráficos
fig.update_xaxes(title_text="Data", row=1, col=1)
fig.update_xaxes(title_text="Data", row=2, col=1)
# Configura o título dos eixos Y para ambos os gráficos
fig.update_yaxes(title_text="Preço ($US)", row=1, col=1)
fig.update_yaxes(title_text="Receita ($US Milhões)", row=2, col=1)
# Configura o layout do gráfico
fig.update_layout(showlegend=False,
height=900,
title=stock,
xaxis_rangeslider_visible=True)
# Exibe o gráfico
fig.show()
Passo 1: Usando yfinance para extrair dados de ações da Tesla
- Utilizei o pacote
yfinancepara obter dados históricos das ações da Tesla. - A função
yf.Ticker("TSLA")cria um objeto associado ao ticker"TSLA" (Tesla)que permite acessar diversas informações financeiras. - Em seguida, os dados históricos das ações são extraídos com o método
history(period="max"), que busca todos os dados disponíveis desde o início da negociação das ações. - Após isso, o índice do DataFrame é resetado com
reset_index(inplace=True)para garantir que a coluna "Date" seja tratada como uma coluna regular, e não como o índice. - Por fim,
tesla_data.head()exibe as cinco primeiras linhas do DataFrame para que o usuário possa verificar a estrutura e os dados obtidos.
# Usa a função Ticker para criar um objeto para o ticker da Tesla
tesla = yf.Ticker("TSLA")
# Extrai os dados históricos de ações da Tesla com o máximo de dados disponíveis
tesla_data = tesla.history(period="max")
# Reseta o índice do DataFrame para que a coluna 'Date' fique como uma coluna normal
tesla_data.reset_index(inplace=True)
# Exibe as primeiras 5 linhas do DataFrame para verificar os dados
tesla_data.head()
| Date | Open | High | Low | Close | Volume | Dividends | Stock Splits | |
|---|---|---|---|---|---|---|---|---|
| 0 | 2010-06-29 00:00:00-04:00 | 1.266667 | 1.666667 | 1.169333 | 1.592667 | 281494500 | 0.0 | 0.0 |
| 1 | 2010-06-30 00:00:00-04:00 | 1.719333 | 2.028000 | 1.553333 | 1.588667 | 257806500 | 0.0 | 0.0 |
| 2 | 2010-07-01 00:00:00-04:00 | 1.666667 | 1.728000 | 1.351333 | 1.464000 | 123282000 | 0.0 | 0.0 |
| 3 | 2010-07-02 00:00:00-04:00 | 1.533333 | 1.540000 | 1.247333 | 1.280000 | 77097000 | 0.0 | 0.0 |
| 4 | 2010-07-06 00:00:00-04:00 | 1.333333 | 1.333333 | 1.055333 | 1.074000 | 103003500 | 0.0 | 0.0 |
Passo 2: Usando Web scraping para extrair dados de receita da Tesla
- Utilizei o
requestspara fazer o download da página Macrotrends que contém dados financeiros da Tesla. - O conteúdo da página é recuperado e armazenado na variável
html_data. - Em seguida, o
BeautifulSoupé empregado para parsear o conteúdo HTML da página e facilitar a extração das informações desejadas. - A partir da análise da estrutura da página, a função
pd.read_html()é usada para capturar a tabela de receita da Tesla, que é então armazenada em um DataFrame chamadotesla_revenue. - As colunas do DataFrame são renomeadas para "Date" e "Revenue".
- A formatação de valores monetários (removendo símbolos de dólar e vírgulas) é realizada.
- O código ainda limpa as linhas com dados faltantes ou vazios, garantindo que o DataFrame esteja pronto para análise.
# Usa a biblioteca requests para fazer uma requisição HTTP e obter os dados da página
html_data = requests.get("https://cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud/IBMDeveloperSkillsNetwork-PY0220EN-SkillsNetwork/labs/project/revenue.htm").text
# Usa o BeautifulSoup para fazer o parsing do HTML
soup = BeautifulSoup(html_data, "html.parser")
# Extrai as tabelas da página usando pandas
tesla_tables = pd.read_html(html_data)
# Seleciona a tabela relevante e renomeia as colunas para 'Date' e 'Revenue'
tesla_revenue = tesla_tables[1]
tesla_revenue.columns = ['Date', 'Revenue']
# Exibe as primeiras 5 linhas para conferir os dados extraídos
tesla_revenue.head()
| Date | Revenue | |
|---|---|---|
| 0 | 2022-09-30 | $21,454 |
| 1 | 2022-06-30 | $16,934 |
| 2 | 2022-03-31 | $18,756 |
| 3 | 2021-12-31 | $17,719 |
| 4 | 2021-09-30 | $13,757 |
Preparando os dados
- Removi os caracteres de vírgula e o símbolo de dólar da coluna
'Revenue'no DataFrametesla_revenueusando a funçãoreplace()com regex para manter apenas números. - Removi qualquer valor nulo na coluna
'Revenue'com o métododropna(), garantindo que não haja dados ausentes. - Filtrei o DataFrame para remover linhas onde a coluna
'Revenue'esteja vazia, garantindo que não haja entradas em branco. - Exibi as últimas 5 linhas do DataFrame usando
tail()para verificar os dados limpos e garantir que as transformações foram aplicadas corretamente.
# Remove os caracteres de vírgula e o símbolo de dólar da coluna de 'Revenue'
tesla_revenue["Revenue"] = tesla_revenue["Revenue"].replace(r"[^0-9]", "", regex=True)
# Remove qualquer valor nulo ou vazio na coluna de 'Revenue'
tesla_revenue.dropna(inplace=True)
tesla_revenue = tesla_revenue[tesla_revenue['Revenue'] != ""]
# Exibe as últimas 5 linhas do DataFrame para verificar os dados limpos
tesla_revenue.tail()
| Date | Revenue | |
|---|---|---|
| 48 | 2010-09-30 | 31 |
| 49 | 2010-06-30 | 28 |
| 50 | 2010-03-31 | 21 |
| 52 | 2009-09-30 | 46 |
| 53 | 2009-06-30 | 27 |
Passo 3: Usando yfinance para extrair dados de ações da GameStop
Para a GameStop, repeti os mesmos processos anteriores das ações da Tesla.
# Cria um objeto para o ticker da GameStop
gme = yf.Ticker("GME")
# Extrai os dados históricos de ações da GameStop
gme_data = gme.history(period="max")
# Reseta o índice do DataFrame da GameStop
gme_data.reset_index(inplace=True)
# Exibe as primeiras 5 linhas para verificar os dados
gme_data.head()
| Date | Open | High | Low | Close | Volume | Dividends | Stock Splits | |
|---|---|---|---|---|---|---|---|---|
| 0 | 2002-02-13 00:00:00-05:00 | 1.620128 | 1.693350 | 1.603296 | 1.691666 | 76216000 | 0.0 | 0.0 |
| 1 | 2002-02-14 00:00:00-05:00 | 1.712707 | 1.716074 | 1.670626 | 1.683250 | 11021600 | 0.0 | 0.0 |
| 2 | 2002-02-15 00:00:00-05:00 | 1.683251 | 1.687459 | 1.658002 | 1.674834 | 8389600 | 0.0 | 0.0 |
| 3 | 2002-02-19 00:00:00-05:00 | 1.666418 | 1.666418 | 1.578047 | 1.607504 | 7410400 | 0.0 | 0.0 |
| 4 | 2002-02-20 00:00:00-05:00 | 1.615920 | 1.662209 | 1.603296 | 1.662209 | 6892800 | 0.0 | 0.0 |
Passo 4: Usando Web scraping para extrair dados de receita da GameStop
Para a GameStop, repeti os mesmos processos anteriores das ações da Tesla.
# Faz uma requisição HTTP para obter os dados da página da GameStop
html_data_2 = requests.get("https://cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud/IBMDeveloperSkillsNetwork-PY0220EN-SkillsNetwork/labs/project/stock.html").text
# Faz o parsing do HTML da página usando BeautifulSoup
soup = BeautifulSoup(html_data_2, "html.parser")
# Extrai a tabela de receita da GameStop e armazena em um DataFrame
gme_tables = pd.read_html(html_data_2)
gme_revenue = gme_tables[1]
gme_revenue.columns = ['Date', 'Revenue']
# Exibe as últimas 5 linhas para verificar os dados extraídos
gme_revenue.head()
| Date | Revenue | |
|---|---|---|
| 0 | 2020-04-30 | $1,021 |
| 1 | 2020-01-31 | $2,194 |
| 2 | 2019-10-31 | $1,439 |
| 3 | 2019-07-31 | $1,286 |
| 4 | 2019-04-30 | $1,548 |
Preparando os dados
Para a GameStop, repeti os mesmos processos anteriores das ações da Tesla.
# Remove os caracteres de vírgula e o símbolo de dólar da coluna de 'Revenue'
gme_revenue["Revenue"] = gme_revenue["Revenue"].replace(r"[^0-9]", "", regex=True)
# Remove qualquer valor nulo ou vazio na coluna de 'Revenue'
gme_revenue.dropna(inplace=True)
gme_revenue = gme_revenue[gme_revenue['Revenue'] != ""]
# Exibe as últimas 5 linhas do DataFrame para verificar os dados limpos
gme_revenue.tail()
| Date | Revenue | |
|---|---|---|
| 57 | 2006-01-31 | 1667 |
| 58 | 2005-10-31 | 534 |
| 59 | 2005-07-31 | 416 |
| 60 | 2005-04-30 | 475 |
| 61 | 2005-01-31 | 709 |
Passo 5: Plotando o gráfico da Tesla
Por fim, vamos plotar o gráfico de resultados da Tesla.
# Chama a função make_graph para gerar o gráfico da Tesla com os dados de ações e receita
make_graph(tesla_data, tesla_revenue, 'Tesla')
Passo 6: Plotando o gráfico da GameStop
Por fim, vamos plotar o gráfico de resultados da GameStop.
# Chama a função make_graph para gerar o gráfico da GameStop com os dados de ações e receita
make_graph(gme_data, gme_revenue, 'GameStop')
Conclusões¶
Através da análise dos dados de ações e receita da Tesla e GameStop, foi possível observar algumas tendências interessantes:
Tesla:
- Crescimento consistente: As ações da Tesla apresentaram um crescimento significativo ao longo dos anos, impulsionado pela demanda por veículos elétricos e pela inovação da empresa.
- Aumento da receita: A receita da Tesla também demonstrou um aumento considerável, acompanhando o crescimento das vendas de veículos e de outros produtos e serviços da empresa.
- Volatilidade: Apesar do crescimento, as ações da Tesla também demonstram volatilidade, com períodos de alta e baixa. Isso pode ser atribuído a diversos fatores, como notícias do mercado, expectativas dos investidores e a própria natureza inovadora da empresa.
GameStop:
- Flutuações acentuadas: As ações da GameStop apresentaram flutuações significativas nos últimos anos, impulsionadas por eventos como o "short squeeze" de 2021, onde pequenos investidores se uniram para inflar o preço das ações.
- Receita em transformação: A receita da GameStop tem passado por um período de transformação, com a empresa buscando se adaptar ao mercado de jogos digitais e diversificar seus negócios.
- Maior risco: As ações da GameStop são consideradas de maior risco, devido à volatilidade e às incertezas sobre o futuro da empresa no mercado de games.
Considerações Gerais:
- O web scraping se mostrou uma ferramenta eficiente para coletar dados financeiros de empresas públicas, permitindo a análise de informações relevantes para a tomada de decisões de investimento.
- A visualização de dados com a biblioteca Plotly possibilitou a identificação de tendências e padrões nos dados, facilitando a compreensão do desempenho das empresas ao longo do tempo.
- É importante ressaltar que este projeto tem fins educacionais e as conclusões aqui apresentadas não devem ser interpretadas como recomendações de investimento.
Observação: Os insights acima são baseados em informações gerais sobre as empresas e podem não refletir a realidade atual do mercado. Para uma análise mais aprofundada, é recomendado consultar fontes de dados e informações financeiras atualizadas.